package dao;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

import pojo.Aluno;

public class AlunoDaoImp implements AlunoDao {

	/*public static void main(String arg[]){
		AlunoDaoImp alunoDao = new AlunoDaoImp();
		alunoDao.listar();
		List<Integer> regTurmas = new ArrayList<Integer>();
		for (int i = 6; i > 0; i--) {
			regTurmas.add(i);
		}
		Aluno aluno = new Aluno(777, "Aluno Teste", "1234567890", regTurmas);
		alunoDao.add(aluno);
		alunoDao.saveData();
	}*/
	
	private List<Aluno> alunos;
	private static int nextId;
	
	public AlunoDaoImp() {
		this.alunos = new ArrayList<Aluno>();
		loadData();
	}
	public void loadData() {
		try{
			File in = new File("files/Aluno.txt");
			InputStream fileLeitura = new  FileInputStream(in);
			InputStreamReader wLeitura = new InputStreamReader(fileLeitura);  
			BufferedReader bufLeitura = new BufferedReader(wLeitura);

			String linha = bufLeitura.readLine();
			this.alunos.clear();
			Aluno aux;
			
			while(linha!= null) {
				String s[] = linha.split("\\t");
				List<Integer> turmas = new ArrayList<Integer>();
				for (int i = 0; i < Integer.parseInt(s[3]); i++) {
					turmas.add(Integer.parseInt(s[4+i]));
				}
				aux = new Aluno(Integer.parseInt(s[0]), s[1],s[2], turmas);
				this.alunos.add(aux);
				linha = bufLeitura.readLine();
			}
			
			bufLeitura.close();
			wLeitura.close();
			fileLeitura.close();
		} catch (NumberFormatException e) {
			String erro = "ERRO: Dados de Alunos corrompidos." +
					"\nFeche seus trabalhos e solicite ao administrador" +
					" uma restauracao deste sistema.";
			System.out.println(erro);
			// throw new IOException(erro);
		} catch (IOException e) {
			String erro = "Aviso: Nao foi possivel encontrar os dados dos " +
					"Alunos. Se esta for a primeira execucao do sistema " +
					"por favor desconsidere o problema, caso contrario " +
					"feche o programa e contate o administrador.";
			System.out.println(erro);
			// throw new IOException(erro);
		}
		updateNextId();
	}
	@Override
	public void saveData() {
		try{
			File out = new File("files/Aluno.txt");
			OutputStream fileEscrita = new  FileOutputStream(out);
			OutputStreamWriter wEscrita = new OutputStreamWriter(fileEscrita);  
			BufferedWriter bufEscrita = new BufferedWriter(wEscrita);
					
			for (Aluno aluno : this.alunos) {
				bufEscrita.write(aluno.toStringIDs()+"\n");
			}
			
			bufEscrita.close();
			wEscrita.close();
			fileEscrita.close();
		}
		catch(IOException e){
			System.out.println("ERRO: Nao foi possivel salvar os dados dos " +
					"Alunos no sistema."
					+ "\nContate o administrador e informe este erro.");
		}
		updateNextId();
	}
	@Override
	public boolean add(Aluno al){
		if (this.alunos.contains(al)) {
			return false;
		} else {
			this.alunos.add(al);
			updateNextId();
			saveData();
			return true;
		}
	}
	public boolean addAluno(Aluno al) {
		loadData();
		if (alunos.contains(al)) {
			return false;
		} else {
			this.alunos.add(al);
			updateNextId();
			saveData();
			return true;
		}
	}
	@Override
	public boolean delete(Aluno aluno) {
		updateNextId();
		// TODO Auto-generated method stub
		return false;
	}
	@Override
	public Aluno get(int id) {
		for (Aluno aluno : alunos) {
			if(aluno.getId() == id) {
				return aluno;
			}
		}
		return null;
	}
	@Override
	public List<Aluno> get(String nome) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public List<Aluno> get() {
		return alunos;
	}
	
	@Override
	public boolean isEmpty() {
		return alunos.isEmpty();
	}
	@Override
	public Aluno getCPF(String cpf) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void listar() {
		System.out.println("--------------------");
		for (Aluno aluno : alunos) {
			System.out.println("-> "+aluno);
		}
		System.out.println("--------------------");
	}
	public int nextId() {
		// TODO Auto-generated method stub
		return 0;
	}
	private void updateNextId(){
		int id = 0;
		while(hasId(id)){
			id++;
		}
		nextId = id;
		return;
	}
	@Override
	public boolean hasId(int id){
		for (Aluno aluno : alunos) {
			if(aluno.getId() == id) {
				return true;
			}
		}
		return false;
	}
	public static int getNextId() {
		return nextId;
	}
	@Override
	public void clearAll() {
		alunos.clear();
	}

}
